<?
	function raid()
	{
		$rootraid = 'md1';
		$disks_arr = array(); // status utifrån diskar
		$raid_arr = array(); // status utifrån raid
		$disk2slot = array(); // array över koppling device - slot
		$disk_name = array(); // tillverkare och modell
		$disk_size = array();
		$disks_unused = array(); // diskar som inte används i raid
		$rebuild_stat = '';

		// Sätter ata-kontroller på att scanna efter nya enheter
		$dh  = opendir('/sys/class/scsi_host/');
		while (false !== ($filename = readdir($dh))) {
			if( preg_match('/^(host[0-9]+)$/', $filename, $match) ) {
				$host = $match[1];
				exec('echo 0 - 0 > /sys/class/scsi_host/'.$host.'/scan');
			}
		}
		sleep(1);

		// Kontrollerar så att / är monterad på raidenhet (dvs, raidinfo ska visas)
		exec('/bin/mount | grep "md. on / "', $tmp, $ret);
		if( $ret != 0 ) {
			echo '<p>Systemet körs ej på raid</p>';
			return;
		}

	   // Läs in data om raid
		// hämta arrayinfo om md0 & md1 genom mdadm
		foreach( array('md0','md1', 'md2') AS $md ) {
			$out = array();
			exec('/sbin/mdadm --detail /dev/'.$md.' 2> /dev/null', $out, $ret);
			if( $ret != 0 ) {
				echo '<p><b style="color: #f00">FEL:</b> vid anrop av /sbin/mdadm</p>';
				return;
			}
			foreach( $out AS $line ) {
				if( preg_match('/^\s*Raid Level : (\w*)\s*$/', $line, $match) )
					$raid_arr[$md]['level'] = $match[1];
				if( preg_match('/^\s*Array Size : \w* \(\S* \w* (\S* \w*)\)\s*$/', $line, $match) )
					$raid_arr[$md]['size'] = $match[1];
				if( preg_match('/^\s*State : (.*)$/', $line, $match) )
					$raid_arr[$md]['state'] = $match[1];
				if( preg_match('/^\s*Rebuild Status : (\S*) \w*\s*$/', $line, $match) )
					$rebuild_stat = $match[1];
			}
		}
		/*// varnar ifall md0 & md1 har olika raidnivåer
		if( $raid_arr['md0']['level'] != $raid_arr['md1']['level'] )
			echo '<p><b style="color: #f00">VARNING!</b> md0 och md1 har olika raidnivåer vilket inte stöds av det här gränsnittet</p>';*/

		// läs in koppling mellan enhetsnamn (sd) och slot, spara diskstorlek
		$dh  = opendir('/sys/class/scsi_device/');
		while (false !== ($filename = readdir($dh))) {
			if( preg_match('/^([0-9]):/', $filename, $match) ) {
				$slot = $match[1];
				$dh2  = opendir('/sys/class/scsi_device/'.$filename.'/device/');
				while (false !== ($filename2 = readdir($dh2))) {
					if( preg_match('/^block:(.*)$/', $filename2, $match ) ) {
						$disk = $match[1];

						$disk2slot[ $disk ] = $slot;

						// läser in namn på disk
						$vendor = file_get_contents('/sys/class/scsi_device/'.$filename.'/device/vendor');
						$model = file_get_contents('/sys/class/scsi_device/'.$filename.'/device/model');
						$disk_name[ $disk ] = array('vendor' => $vendor, 'model' => $model);

						// läser in storlek på disken
						$str = exec('/sbin/fdisk -l /dev/'.$disk.' 2> /dev/null | grep "Disk /dev/'.$disk.':"');
						preg_match('/^Disk \/dev\/sd.: (\S* \w*), /', $str, $match);
						$disk_size[$disk] = $match[1];
					}
				}
			}
		}

		// läs in arraystat från proc
		$str = file_get_contents('/proc/mdstat');
		
		// läs in diskar kopplade till raid md0, md1 & md2
		preg_match('/^md0 : active raid. (.*)$/m', $str, $match);
		$disks_md0 = explode(' ', $match[1]);
		preg_match('/^md1 : active raid. (.*)$/m', $str, $match);
		$disks_md1 = explode(' ', $match[1]);
		preg_match('/^md2 : active raid. (.*)$/m', $str, $match);
		$disks_md2 = explode(' ', $match[1]);
		
		// skapa träd för diskpartitionstatus för de olika raiden
		foreach( $disks_md0 AS $disk ) {
			preg_match('/(sd.)([1-9])\[.\](\S*)/', $disk, $match);
			$raid_arr['md0'][ $match[1] ]['part'] = $match[2];
			$raid_arr['md0'][ $match[1] ]['stat'] = $match[3];
			$disks_arr[ $match[1] ] = array();
		}
		foreach( $disks_md1 AS $disk ) {
			preg_match('/(sd.)([1-9])\[.\](\S*)/', $disk, $match);
			$raid_arr['md1'][ $match[1] ]['part'] = $match[2];
			$raid_arr['md1'][ $match[1] ]['stat'] = $match[3];
			$disks_arr[ $match[1] ] = array();
		}
		foreach( $disks_md2 AS $disk ) {
			preg_match('/(sd.)([1-9])\[.\](\S*)/', $disk, $match);
			$raid_arr['md2'][ $match[1] ]['part'] = $match[2];
			$raid_arr['md2'][ $match[1] ]['stat'] = $match[3];
			$disks_arr[ $match[1] ] = array();
		}

		// Bygger statusinfo-arr utifrån disk
		foreach( $disks_arr AS $disk => $tmp ) {
			/*
			// letar diskar som enbart finns i ena raiden (både swap och data ska vara i raid)
			if( ! isset( $raid_arr['md0'][$disk] ) ) {
				echo '<p><b style="color: #f00">Varning!</b> '.$disk.' i md1 men inte md0</p>';
				$disks_arr[$disk]['stat'] = '?';
			}
			else if( ! isset( $raid_arr['md1'][$disk] ) ) {
				echo '<p><b style="color: #f00">Varning!</b> '.$disk.' i md0 men inte md1</p>';
				$disks_arr[$disk]['stat'] = '?';
			}
			*/

			// om någon är trasig
			if( ($raid_arr['md0'][$disk]['stat'] == '(F)') || ($raid_arr['md1'][$disk]['stat'] == '(F)') || ($raid_arr['md2'][$disk]['stat'] == '(F)') )
				$disks_arr[$disk]['stat'] = 'Trasig';
			// om data-raid är clean
			else if( ($raid_arr[$rootraid][$disk]['stat'] == '') )
				$disks_arr[$disk]['stat'] = 'Aktiv';
			// om data-raid är reserv (spare)
			else if( ($raid_arr[$rootraid][$disk]['stat'] == '(S)') )
				$disks_arr[$disk]['stat'] = 'Reserv';
			// okänt läge
			else
				$disks_arr[$disk]['stat'] = '?';
		}

		// skapar lista över diskar som inte används i raid
		foreach( $disk2slot AS $disk => $slot ) {
			if( ! array_key_exists($disk, $disks_arr) && isset( $disk_size[$disk] ) ) {
				$mounts = file_get_contents('/proc/mounts');
				// Om disken ej är monterad
				if( !preg_match('#^/dev/sdc[1-9]\s#m', $mounts) )
					$disks_unused[] = $disk;
			}
		}


		// Visa
		if( $raid_arr['md0']['state'] != 'clean' || $raid_arr['md1']['state'] != 'clean' || $raid_arr['md2']['state'] != 'clean' ) {
			echo '<p style="color: #f00"><b>Varning!</b><br>';
			echo 'Raid ej redo för att någon aktiv hårddisk plockas bort</p><br>';
		}

		echo '<table>';
		echo '<tr><td>Typ: </td><td style="padding-left: 1em"><i>';
		/*
		if( $disk_arr['md0']['level'] != $disk_arr['md1']['level'] )
			echo ucfirst($raid_arr['md0']['level']).' / '.ucfirst($raid_arr['md1']['level']);
		else
		*/
		echo ucfirst($raid_arr[$rootraid]['level']);
		echo '</i></td></tr>';
		echo '<tr><td>Storlek: </td><td style="padding-left: 1em"><i>';
		//echo $raid_arr['md0']['size'].' / '.$raid_arr['md1']['size'];
		echo $raid_arr[$rootraid]['size'];
		echo '</i></td></tr>';
		echo '<tr><td>Status: </td><td style="padding-left: 1em"><i>';
		$state0 = $raid_arr['md0']['state'];
		$state1 = $raid_arr['md1']['state'];
		$state2 = $raid_arr['md2']['state'];
		if( $state0 == 'clean, degraded, recovering' || $state1 == 'clean, degraded, recovering' || $state2 == 'clean, degraded, recovering'
			|| $state0 == 'active, degraded, recovering' || $state1 == 'active, degraded, recovering' || $state2 == 'active, degraded, recovering' )
			echo "Synkroniserar, ej komplett";
		else if( $state0 == 'clean' && $state1 == 'clean' && $state2 == 'clean' )
			echo "Synkroniserad";
		else if( $state0 == 'clean, degraded' || $state1 == 'clean, degraded' || $state2 == 'clean, degraded' )
			echo "Ej komplett";
		else
			echo "$state0 / $state1 / $state2";
		echo '</i></td></tr>';
		//Återbyggd %
		/*
		if( $rebuild_stat != '' ) {
			echo '<tr><td>Återbyggning: </td><td style="padding-left: 1em"><i>';
			echo $rebuild_stat;
			echo '</i></td></tr>';
		}
		*/
		echo '</table><br>';

		echo '<table>';
		echo '<tr><td class="tbhead" colspan="6">Aktiva hårddiskar i raid</td></tr>';
		echo '<tr><td class="tbhead" style="width: 2em; text-align: center">slot</td><td class="tbhead" style="width: 10em; text-align: center">tillverkare</td><td class="tbhead" style="width: 15em; text-align: center">modell</td><td class="tbhead" style="width: 4em; text-align: center">storlek</td><td class="tbhead" style="width: 4em; text-align: center">status</td><td class="tbhead">&nbsp;</tr>';
		// listar arraydiskar
		foreach( $disks_arr AS $name => $arr ) {
			if( $disk2slot[$name] == '' )
				$slotname = '-';
			else
				$slotname = 'hd' . strval(intval($disk2slot[$name]) + 1);
			if( $disk_name[$name]['vendor'] == '' )
				$vendor = '';
			else
				$vendor = $disk_name[$name]['vendor'];
			if( $disk_name[$name]['model'] == '' )
				$model = '';
			else
				$model = $disk_name[$name]['model'];
			if( $disk_size[$name] == '' )
				$size = '-';
			else
				$size = $disk_size[$name];

			echo '<tr><td style="text-align: center">'.$slotname.'</td><td style="text-align:center">'.$vendor.'</td><td style="text-align:center">'.$model.'</td><td style="text-align: center">'.$size.'</td><td style="text-align: center">';
			if( $arr['stat'] == 'Aktiv' )
				echo '<span style="color: #0b0">';
			else if( $arr['stat'] == 'Reserv' )
				echo '<span style="color: #990">';
			else
				echo '<span style="color: #b00">';
			echo $arr['stat'].'</span></td><td>';
			if( $arr['stat'] != 'Trasig')
				echo '&nbsp;';
			else
				echo '<input name="del:'.$name.'" type="submit" class="button" value="Ta bort">';
			echo '</td></tr>';
		}

		echo '</table><br>';

		echo '<table>';
		echo '<tr><td class="tbhead" colspan="6">Tillgängliga hårddiskar</td></tr>';
		echo '<tr><td class="tbhead" style="width: 2em; text-align: center">slot</td><td class="tbhead" style="width: 10em; text-align: center">tillverkare</td><td class="tbhead" style="width: 15em; text-align: center">modell</td><td class="tbhead" style="width: 4em; text-align: center">storlek</td><td class="tbhead">&nbsp;</tr>';

		// Listar oanvända diskar
		foreach(  $disks_unused AS $name ) {
			$slot = $disk2slot[$name];
			$slotname = 'hd'. strval($slot + 1);
			$vendor = $disk_name[$name]['vendor'];
			$model = $disk_name[$name]['model'];
			$size = $disk_size[$name];
		echo '<tr><td style="text-align: center">'.$slotname.'</td><td style="text-align:center">'.$vendor.'</td><td style="text-align:center">'.$model.'</td><td style="text-align: center">'.$size.'</td><td><input name="add:'.$name.'" type="submit" class="button" value="Lägg till"></td></tr>';
		}
		echo '</table><br>';
	}

////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////

	html_start( array(
		array('raid', 'Raid'), 
	));

        raid();
        html_end();
?>
